#通过父类名访问父类成员
class A:
    n1 = 100
    #定义私有成员
    __n2 = 600

    def run(self):
        print("A-run()...")

    #定义私有方法
    def __jump(self):
        print("A-jump()...")

class B(A):
    n1 = 200

    def run(self):
        print("B-run()...")

    def say(self):
        print(f"父类的n1{A.n1} 本类n1{self.n1}")#100 , 200
        #调用父类的run,因为方法的格式需要参数
        A.run(self)#A-run()...

        #调用本类的run,这里的self其实是实例化对象
        self.run()#B-run()...

    def hi(self):
        print(f"父类的n1{super().n1}")#100
        #调用父类的run
        super().run()#A-run()...

    def read(self):
        pass
        #子类不能直接访问父类的私有成员
        # print(A.__n2)
        # print(super().__n2)

        #子类不能直接访问父类的私有方法
        # super().__jump()


"""
总结：
其实这里访问成员变量分为三种情况
1.访问本类,是直接从本类开始查找,如果找不到去父类，再找不到去爷爷类，以此类推，最后顶级都找不到，就报错
2.访问父类,直接从父类开始  super().xxx
3.指定类的方法,从指定类开始访问 ， 以此类推
"""
b = B()
# b.say()
# b.hi()
b.read()